<?php

App::import('Sanitize');

class NivelesController extends AppController {

    var $name = 'Niveles';
    var $paginate = array(
        'order' => array('Nivele.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //parent::beforeFilter();
    }

    function index($estado_id = null, $nivele_id = null) {
        $this->__aux_index($estado_id, $nivele_id);
    }

    function admin_index($estado_id = null, $nivele_id = null) {
        $this->__aux_index($estado_id, $nivele_id);
    }

    function __aux_index($estado_id = null, $nivele_id = null) {
        $this->Nivele->recursive = 0;
        $this->paginate['order'] = 'Estado.ponderacion';

        $condiciones = array();

        $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));
        $estados['0'] = 'Todos';
        if (!empty($estado_id))
            $this->data['Nivele']['estado_id'] = $estado_id;

        $lista_niveles = array();
        if (!empty($nivele_id))
            $this->data['Nivele']['nivele_id'] = $nivele_id;

        $nombre = '';

        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (isset($this->data['Nivele']['estado_id']) && !empty($this->data['Nivele']['estado_id'])) {
                $condiciones[] = "Estado.id = {$this->data['Nivele']['estado_id']}";
            }

            if (isset($this->data['Nivele']['estado_id']) && (!empty($this->data['Nivele']['estado_id']) || ($this->data['Nivele']['estado_id'] == '0'))) {
                $estado_id = $this->data['Nivele']['estado_id'];
                $this->Session->write('estado_id', $estado_id);
            }

            if (isset($this->data['Nivele']['nivele_id']) && !empty($this->data['Nivele']['nivele_id'])) {
                $condiciones[] = "Nivele.id = {$this->data['Nivele']['nivele_id']}";
            }

            if (isset($this->data['Nivele']['nivele_id']) && ((!empty($this->data['Nivele']['nivele_id']) || ($this->data['Nivele']['nivele_id'] == '0')))) {
                $nivele_id = $this->data['Nivele']['nivele_id'];

                if (!empty($this->data['Nivele']['estado_id'])) {
                    $lista_niveles = $this->Nivele->find('list', array('conditions' => array('Nivele.estado_id' => $this->data['Nivele']['estado_id']),
                                'fields' => array('Nivele.id', 'Nivele.nivel_servicio')));
                } else {
                    $lista_niveles = $this->Nivele->find('list', array('fields' => array('Nivele.id', 'Nivele.nivel_servicio')));
                }
                $lista_niveles[0] = 'Todos';
                $this->Session->write('nivele_id', $nivele_id);
                $this->Session->write('lista_niveles', $lista_niveles);
            }

            if (isset ($this->data['Nivele']['nombre']) && !empty($this->data['Nivele']['nombre'])) {
                $nivel = utf8_encode(strtolower(utf8_decode(trim($this->data['Nivele']['nombre']))));
                $condiciones[] = "lower(Nivele.nivel_servicio) LIKE '%{$nivel}%'";
                $nombre = $this->data['Nivele']['nombre'];
                $this->Session->write('nombre', $nombre);
            }
            $this->Session->write('niveles_filter', $condiciones);
        } elseif ($this->Session->check('niveles_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('niveles_filter');
                $estado_id = ($this->Session->check('estado_id')) ? $this->Session->read('estado_id') : '';
                $nivele_id = ($this->Session->check('nivele_id')) ? $this->Session->read('nivele_id') : '';
                $lista_niveles = ($this->Session->check('lista_niveles')) ? $this->Session->read('lista_niveles') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('niveles_filter');
                $this->Session->delete('estado_id');
                $this->Session->delete('nivele_id');
                $this->Session->delete('lista_niveles');
                $this->Session->delete('nombre');
            }
        }

        $this->paginate['conditions'] = $condiciones;
        $this->set('niveles', $this->paginate());
        $referer = $this->referer();
        $this->set(compact('estado_id', 'estados', 'nivele_id', 'lista_niveles', 'nombre', 'referer'));
        $this->render('index');
    }

    function view_niveles($estado_id = null) {
        $this->__aux_view_niveles($estado_id);
    }

    function admin_view_niveles($estado_id = null) {
        $this->__aux_view_niveles($estado_id);
    }

    /**
     *
     * @param <type> $estado_id
     */
    function __aux_view_niveles($estado_id = null) {
        $this->layout = false;
        $lista_niveles = array();

        if (!empty($estado_id)) {
            $lista_niveles = $this->Nivele->find('list', array('conditions' => array('Nivele.estado_id' => $estado_id),
                        'fields' => array('Nivele.id', 'Nivele.nivel_servicio')));
        } else {
            $lista_niveles = $this->Nivele->find('list', array('fields' => array('Nivele.id', 'Nivele.nivel_servicio')));
        }
        $lista_niveles[0] = 'Todos';
        $this->set(compact('estado_id', 'lista_niveles'));
        $this->render('view_niveles');
    }

    function add($estado_id = null) {
        $this->__aux_add($estado_id);
    }

    function admin_add($estado_id = null) {
        $this->__aux_add($estado_id);
    }

    /**
     * Permite dar de alta un nuevo nivel de servicio y su índice de estado asociado
     */
    function __aux_add($estado_id = null) {
        $estado_id = (empty($estado_id)) ? '' : $estado_id;
        if (!empty($this->data)) {

            $minimo = $this->data['Nivele']['minimo'];
            $maximo = $this->data['Nivele']['maximo'];
            $nivel_servicio = utf8_encode(strtolower(utf8_decode(trim($this->data['Nivele']['nivel_servicio']))));

            $nombre_estado = utf8_encode(strtolower(utf8_decode(trim($this->data['Estado']['nombre']))));
            $ponderacion = $this->data['Estado']['ponderacion'];

            // Chequeo si existe en la db un índice de estado con el mismo nombre y/o ponderación
            $estado = $this->Estado->find('all', array('conditions' => array("or" => array('lower(Estado.nombre)' => "{$nombre_estado}", 'Estado.ponderacion' => "{$ponderacion}"))));

            $this->Nivele->begin();
            if (empty($estado)) {
                // Chequeo si existe en la db un nivel de servicio con los mismos valores mínimo, máximo y nivel de servicio
                $nivele = $this->Nivele->find('all', array('conditions' => array("or" => array('Nivele.minimo' => "{$minimo}", 'Nivele.maximo' => "{$maximo}", 'lower(Nivele.nivel_servicio)' => "{$nivel_servicio}"))));
                if (empty($nivele)) {

                    if ($this->Estado->save($this->data['Estado'])) {

                        $estado_id = $this->Estado->id;
                        $this->data['Nivele']['estado_id'] = $estado_id;

                        $this->Nivele->create();
                        if ($this->Nivele->save($this->data['Nivele'])) {
                            $nivele_id = $this->Nivele->id;
                            $this->Nivele->commit();
                            $this->Session->setFlash(__('El nivel de servicio se guardó correctamente.', true), 'flash_success');
                            $this->redirect(array('action' => 'admin_index', $estado_id, $nivele_id));
                        } else {
                            $this->Nivele->rollback();
                            $this->Session->setFlash(__('El nivel de servicio no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                        }
                    } else {
                        $this->Nivele->rollback();
                        $this->Session->setFlash(__('El nivel de servicio no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                } else {
                    $this->Nivele->rollback();
                    $this->Session->setFlash(__('Ya existe en la base de datos un nivel de servicio con el mismo valor mínimo, máximo y/o el mismo nombre.', true), 'flash_failure');
                }
            } else {
                $this->Nivele->rollback();
                $this->Session->setFlash(__('Ya existe en la base de datos un estado con la misma ponderación y/o el mismo nombre.', true), 'flash_failure');
            }
        }
        $referer = $this->referer();
        $this->set(compact('estado_id', 'referer'));
        $this->render('add');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Permite eliminar un nivel de servicio seleccionado si no existen obras, evaluaciones y/o intervenciones
     * con ese nivel o elementos de la superestructura, infraestructura y/o señalización con el índice de estado
     * asociado al nivel de servicio que se quiere eliminar.
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Nivel de servicio inválido', true), 'flash_failure');
        } else {
            // Chequeo que el nivel de servicio exista
            $nivele = $this->Nivele->find('all', array('conditions' => array('Nivele.id' => $id)));
            if (!empty($nivele)) {
                $nivele_name = $nivele[0]['Nivele']['nivel_servicio'];
                // Chequeo si hay obras, evaluaciones y/o intervenciones con ese nivel de servicio
                $obras = $this->Obra->find('all', array('recursive' => 0, 'conditions' => array('Obra.nivele_id' => $id)));
                $evaluaciones = $this->Evaluacione->find('all', array('recursive' => 0, 'conditions' => array('Evaluacione.nivele_id' => $id)));
                $intervenciones = $this->Intervencione->find('all', array('recursive' => 0, 'conditions' => array('Intervencione.nivele_id' => $id)));

                if (!empty($obras) || !empty($evaluaciones) || !empty($intervenciones)) {
                    $this->Session->setFlash(__('El nivel de servicio "' . $nivele_name . '" no se puede eliminar porque existen obras, evaluaciones y/o intervenciones con ese nivel.', true), 'flash_failure');
                } else {
                    // Chequeo si hay elementos de la superestructura, infraestructura y/o señalización con ese índice de estado
                    $superestructuras = $this->ElementosSuperestructura->find('all', array('recursive' => 0, 'conditions' => array('ElementosSuperestructura.estado_id' => $nivele[0]['Nivele']['estado_id'])));
                    $infraestructuras = $this->ElementosInfraestructura->find('all', array('recursive' => 0, 'conditions' => array('ElementosInfraestructura.estado_id' => $nivele[0]['Nivele']['estado_id'])));
                    $senializaciones = $this->ElementosSenializacione->find('all', array('recursive' => 0, 'conditions' => array('ElementosSenializacione.estado_id' => $nivele[0]['Nivele']['estado_id'])));

                    if (!empty($superestructuras) || !empty($infraestructuras) || !empty($senializaciones)) {
                        $this->Session->setFlash(__('El nivel de servicio "' . $nivele_name . '" no se puede eliminar porque existen elementos de la superestructura, infraestructura y/o señalización con ese índice de estado.', true), 'flash_failure');
                    } else {
                        if ($this->Nivele->delete($id)) {
                            $this->Session->setFlash(__('El nivel de servicio "' . $nivele_name . '" se eliminó correctamente.', true), 'flash_success');
                        } else {
                            $this->Session->setFlash(__('El nivel de servicio no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                        }
                    }
                }
            } else {
                $this->Session->setFlash(__('Nivel de servicio inválido', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'admin_index'));
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar un nivel de servicio y su índice de estado asociado
     */
    function __aux_edit($id = null) {
        if (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Nivel de servicio inválido', true), 'flash_failure');
            $this->redirect(array('action' => 'admin_add'));
        } elseif (empty($this->data)) {
            $this->data = $this->Nivele->read(null, $id);
        } elseif (!empty($this->data)) {

            $minimo = $this->data['Nivele']['minimo'];
            $maximo = $this->data['Nivele']['maximo'];
            $nivel_servicio = utf8_encode(strtolower(utf8_decode(trim($this->data['Nivele']['nivel_servicio']))));

            $nombre_estado = utf8_encode(strtolower(utf8_decode(trim($this->data['Estado']['nombre']))));
            $ponderacion = $this->data['Estado']['ponderacion'];

            // Chequeo si existe en la db un estado de servicio con el mismo nombre y/o ponderación
            $estado = $this->Estado->find('all', array('conditions' => array("Estado.id <>" => $this->data['Nivele']['estado_id'], "or" => array('lower(Estado.nombre)' => "{$nombre_estado}", 'Estado.ponderacion' => "{$ponderacion}"))));

            $this->Nivele->begin();
            if (empty($estado)) {
                // Chequeo si existe en la db un nivel de servicio con los mismos valores mínimo, máximo y nivel de servicio
                $nivele = $this->Nivele->find('all', array('conditions' => array("Nivele.id <>" => $id, "or" => array('Nivele.minimo' => "{$minimo}", 'Nivele.maximo' => "{$maximo}", 'lower(Nivele.nivel_servicio)' => "{$nivel_servicio}"))));
                if (empty($nivele)) {
                    $this->data['Estado']['id'] = $this->data['Nivele']['estado_id'];
                    if ($this->Estado->save($this->data['Estado'])) {

                        $estado_id = $this->Estado->id;
                        $this->data['Nivele']['estado_id'] = $estado_id;

                        $this->Nivele->create();
                        if ($this->Nivele->save($this->data['Nivele'])) {
                            $this->Nivele->commit();
                            $this->Session->setFlash(__('El nivel de servicio se guardó correctamente.', true), 'flash_success');
                            $this->redirect(array('action' => 'admin_index', $estado_id, $id));
                        } else {
                            $this->Nivele->rollback();
                            $this->Session->setFlash(__('El nivel de servicio no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                        }
                    } else {
                        $this->Nivele->rollback();
                        $this->Session->setFlash(__('El nivel de servicio no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                } else {
                    $this->Nivele->rollback();
                    $this->Session->setFlash(__('Ya existe en la base de datos un nivel de servicio con el mismo valor mínimo, máximo y/o el mismo nombre.', true), 'flash_failure');
                }
            } else {
                $this->Nivele->rollback();
                $this->Session->setFlash(__('Ya existe en la base de datos un índice de estado con la misma ponderación y/o el mismo nombre.', true), 'flash_failure');
            }
        }
        $referer = $this->referer();
        $this->set(compact('referer'));
        $this->render('edit');
    }

}
?>